/* /////////////////////////////////////////////////////////////////////////////
 * File:        ProjectionFeature.d
 *
 * Purpose:     射影の使われてる特徴量であることを示すインターフェイス
 *
 * Created      13th June 2007
 * Updated:     13th June 2007
 *
 * www:         http://
 *
 * Copyright (C) 2007 by Yasunobu Imamura
 *
 * This software is provided 'as-is', without any express or implied warranty.
 * In no event will the authors be held liable for any damages arising from the
 * use of this software.
 *
 * Permission is granted to anyone to use this software for any purpose,
 * including commercial applications, and to alter it and redistribute it
 * freely, subject to the following restrictions:
 *
 * 1. The origin of this software must not be misrepresented; you must not claim
 * that you wrote the original software. If you use this software in a product,
 * an acknowledgment in the product documentation would be appreciated but is
 * not required.
 *
 * 2. Altered source versions must be plainly marked as such, and must not be
 * misrepresented as being the original software.
 *
 * 3. This notice may not be removed or altered from any source distribution. 
 *
 * ////////////////////////////////////////////////////////////////////////// */

module gtree.ProjectionFeature;

private import gtree.all;

interface IProjectionFeature
{
}

class ProjectionFeature(OT, PT)
	: IProjectionFeature
	, if_implements!(is(OT:ISerializable) && is(PT:ISerializable), ISerializable)
	, if_implements!(is(OT:ICloneable) && is(PT:ICloneable), ICloneable)
{
	alias ProjectionFeature!(OT, PT) MyType;

	OT ot;
	PT pt;

	this(OT ot2, PT pt2)
	{
		static if(is(OT:ICloneable))
			ot = ot2.clone;
		else
			ot = ot2;
		static if(is(PT:ICloneable))
			pt = pt2.clone;
		else
			pt = pt2;
	}

	static if(is(MyType:ISerializable))
		void serialize(Serializer s)
	{
		s.serialize(&ot, &pt);
	}

	static if(is(MyType:ICloneable))
		MyType clone()
	{
		return new MyType(ot, pt);
	}
}
